/*** 本文件由CSMIS2.0-ModelCreater(UTF-8)工具辅助生成，版本1.0 ***/

package com.ce.sys.update.action;

import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Date;

import com.ce.framework.datamaintain.action.DataMaintainAction;
import com.ce.framework.exception.AppException;
import com.ce.framework.util.FileUtil;
import com.ce.framework.util.ZipTools;
import com.ce.sys.login.model.User;
import com.ce.sys.update.dao.po.SysUpdateInfo;
import com.ce.util.NetFileUtil;

/**
* 嫦娥软件有限公司 版权所有 2013
* 创建人：　andy
* 创建日期：2010-11-08
* 创建时间：08:43:57
* 功能描述：系统更新信息表 [SYS_T_UPDATE$INFO]更改时用的Action
* ==============================================
* 修改历史
* 修改人		修改时间		修改原因
*
* ==============================================
*/
public class SysUpdateInfoAction extends DataMaintainAction 
{
	private static final long serialVersionUID = 1L;
	private File updateFile;
    private String updateFileContentType;
	private String updateFileFileName;

	public String getUpdateFileContentType() {
		return updateFileContentType;
	}


	public void setUpdateFileContentType(String updateFileContentType) {
		this.updateFileContentType = updateFileContentType;
	}


	public String getUpdateFileFileName() {
		return updateFileFileName;
	}


	public void setUpdateFileFileName(String updateFileFileName) {
		this.updateFileFileName = updateFileFileName;
	}


	public File getUpdateFile() {
		return updateFile;
	}


	public void setUpdateFile(File updateFile) {
		this.updateFile = updateFile;
	}


	
	/**
	 * 开发人： andy
	 * 开发时间： 2013-11-8 下午03:38:57
	 * 功能描述：添加升级包 
	 *         说明：升级包中的文件目录如下   
	 *                                   |--- 
	 *                                     |--code          (更新的程序代码文件夹)
	 *                                     |--rollback        (更新回退的程序代码文件夹)
	 *                                     |--update.txt      (更新说明文档)
	 * 方法的参数和返回值
	 * @return
	 * @throws AppException
	 * String 
	 * ==================================
	 * 修改历史
	 * 修改人        修改时间      修改原因及内容
	 *
	 * ==================================
	 */
	@SuppressWarnings("deprecation")
	protected String addItem() throws AppException {
		try{ 
			//将升级文件解压后读取升级文件中的更新说明，并在说明读取完毕后删除解压的更新文件
			String fileId = NetFileUtil.saveFile(updateFile,updateFileFileName,"sysUpdate");
			StringBuffer updateInfo = new StringBuffer("");
			try{
				ZipTools.unZip(updateFile.getPath(), this.getRequest().getRealPath("/updateFiles")+"/"+fileId+"/");
				FileReader reader = new FileReader(this.getRequest().getRealPath("/updateFiles")+"/"+fileId+"/update.txt");
				int ch = 0;
				while((ch=reader.read())!=-1){
					updateInfo.append((char)ch);
				}	
			}catch(Exception e){
				updateInfo.append("暂无更新说明信息！");
			}
			//将升级文件信息存入数据库
			this.initVcId();
			SysUpdateInfo update = (SysUpdateInfo)po;
			update.setDtUploadTime(new Date());
			update.setVcFileId(fileId);
			update.setIntUpdateFlag(0);
			update.setVcUpdateDesc(updateInfo.toString());
			this.baselogic.addPo(update,this.getAddList());			
		}catch(Exception e){
			e.printStackTrace();
			throw new AppException("文件上传失败！");
		}
		return this.list();
	}
	
	/**
	 * 开发人： andy
	 * 开发时间： 2013-11-8 下午03:38:57
	 * 功能描述：将压缩包更新升级
	 * 方法的参数和返回值
	 * @return
	 * @throws AppException
	 * String 
	 * ==================================
	 * 修改历史
	 * 修改人        修改时间      修改原因及内容
	 *
	 * ==================================
	 */
	public String update()throws AppException{
		try{
			this.releasePackage(this.getParameter("fileId"));
			SysUpdateInfo uploadInfo = (SysUpdateInfo)this.baselogic.getPOByPk(SysUpdateInfo.class.getName(), this.getSelectId());
			uploadInfo.setDtUpdateTime(new Date());
			uploadInfo.setIntUpdateFlag(1);//标志为已更新
			this.baselogic.updatePo(uploadInfo);
		}catch(Exception e){
			e.printStackTrace();
			return this.returnInfoForJS(false, "更新失败，请检查升级包内容！");
		}
		return this.returnInfoForJS(true, null);
	}
	
	/**
	 * 开发人： andy
	 * 开发时间： 2013-11-8 下午03:38:07
	 * 功能描述： 获取升级压缩包并将压缩包中的文件解压升级覆盖到当前应用的路径下
	 * 方法的参数和返回值
	 * @param fileId
	 * @throws IOException
	 * @throws AppException
	 * void 
	 * ==================================
	 * 修改历史
	 * 修改人        修改时间      修改原因及内容
	 *
	 * ==================================
	 */
	@SuppressWarnings("deprecation")
	private void releasePackage(String fileId)throws IOException,AppException{
		//获取升级文件并将文件保存至程序应用所在目录updateFiles文件夹下
		String filePath = this.getRequest().getRealPath("/updateFiles");
		String fileName = NetFileUtil.getFileName(fileId);
		File saveFile = new File(filePath);
		if (!saveFile.exists())
			saveFile.mkdirs();
		OutputStream streamOut = new FileOutputStream(filePath+"/"+fileName);
		InputStream streamIn = NetFileUtil.getInputStream(fileId); 
		int bytesRead;
		byte[] buffer = new byte[8129];
		while ((bytesRead = streamIn.read(buffer, 0, 8129)) != -1) {
			streamOut.write(buffer, 0, bytesRead);
		}
		streamOut.close();
		streamIn.close();
		//解压升级文件到临时文件夹
		ZipTools.unZip(filePath+"/"+fileName, this.getRequest().getRealPath("/updateFiles")+"/"+fileId+"/");
		//将解压的升级文件中的升级代码复制到对应位置
		FileUtil.moveFolder(this.getRequest().getRealPath("/updateFiles")+"/"+fileId+"/code/", this.getRequest().getRealPath("/"));
	}

}

